package com.company.common.util;

import net.sf.cglib.beans.BeanCopier;

import java.util.HashMap;
import java.util.Map;

/**
 * @description:  BeanCopier缓存工具类
 * @projectName:company
 * @see:com.company.common.util
 * @author:徐克
 * @createTime:3/24/2021 公元 10:20
 */
public class CachedBeanCopier {

    /**
     * BeanCopier缓存对象
     */
    static final Map<String, BeanCopier> BEAN_COPIER_MAP = new HashMap<>();

    /**
     * copy方法
     * @param srcObject 被复制对象
     * @param destObject 赋值对象
     */
    public static void copy(Object srcObject,Object destObject){
        //当前传递的key
        String key =genKey(srcObject.getClass(),destObject.getClass());
        BeanCopier copier = null;
        //缓存中是否存在缓存对象
        if(!BEAN_COPIER_MAP.containsKey(key)){
            //不存在则生成
            copier = BeanCopier.create(srcObject.getClass(),destObject.getClass(),false);
            //存储到缓存
            BEAN_COPIER_MAP.put(key,copier);
        }else{
            //缓存中存在重新拿出
            copier = BEAN_COPIER_MAP.get(key);
        }
        //copier类是否存在问题存在则抛出异常
        if(copier!=null) {
            //复制对象
            copier.copy(srcObject, destObject, null);
        }else{
            //copier空指针异常
            throw new NullPointerException("CachedBeanCopier.copy 方法空指针异常");
        }
    }


    /**
     * 根据类名组装生产key
     * @param srcClass 被复制对象
     * @param destClass 赋值对象
     * @return key
     */
    private static String genKey(Class<?> srcClass,Class<?> destClass){
        return srcClass.getName()+destClass.getName();
    }

}

